//package com.wlyy.his.infrastructure.hander;
//
//import cn.hutool.core.util.ArrayUtil;
//import com.alibaba.fastjson.JSON;
//import com.wlyy.his.common.api.CommonResult;
//import com.wlyy.his.common.api.IErrorCode;
//import com.wlyy.his.common.api.ResultCode;
//import com.wlyy.his.common.util.RedisUtil;
//import com.wlyy.his.infrastructure.common.AuthCommon;
//import com.wlyy.his.infrastructure.common.RequestUserInfo;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.core.Ordered;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import javax.servlet.*;
//import javax.servlet.http.Cookie;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.io.IOException;
//import java.util.Arrays;
//
///**
// * @author 10097
// */
//@Slf4j
//@Component
//public class AuthFilter implements Filter, Ordered {
//
//    @Resource
//    private RedisUtil redisUtil;
//
//    @Resource
//    private RequestUserInfo requestUserInfo;
//
//
//    @Override
//    public void init(FilterConfig filterConfig){
//    }
//
//
//    @Override
//    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
//        // TODO: 2021/8/26 需要重构  根据不同的路由 进行解析处理，这里可以使用设计模式优化，待完善
//        // todo 了解为了@webfilter注解不生效
//        //在这里进行拦截
//        HttpServletRequest request = (HttpServletRequest) servletRequest;
//        System.out.println(request);
//        String path = request.getRequestURI();
//        if (!isAuthPath(path)) {
//            chain.doFilter(servletRequest, servletResponse);
//            return;
//        }
//        HttpServletResponse response = (HttpServletResponse) servletResponse;
//        Cookie[] cookies = request.getCookies();
//
//        if (ArrayUtil.isEmpty(cookies)) {
//            writeError(ResultCode.UNAUTHORIZED, response);
//            //无效的请求
//            return;
//        }
//        //根据实际的路由进行判断
//        //先实现用户和医生端
//        if (path.startsWith(AuthCommon.AUTH_PATH[0])) {
//            //患者
//            //从header中读取token
//            //token设置在cookie里面
//            Cookie token = Arrays.stream(cookies).filter(param -> AuthCommon.PRE_COOKIE_NAME.equals(param.getName())).findFirst().orElse(null);
//            if (null == token) {
//                //无效的请求
//                writeError(ResultCode.UNAUTHORIZED, response);
//                return;
//            }
//            //存在token则校验token的有效期
//            //token缓存在redis中，有效时长24*7小时  token与基本的用户信息 如id，name，等进行关联
//            //这里返回的应该是json格式的requestUserInfo对象
//            //尝试进行转换
//            Object cacheObj = redisUtil.get(AuthCommon.CACHE_USER_REDIS_KEY + token.getValue());
//            if (null == cacheObj) {
//                //token失效
//                writeError(ResultCode.UNAUTHORIZED, response);
//                return;
//            }
//            //刷新token
//            redisUtil.set(AuthCommon.CACHE_USER_REDIS_KEY + token.getValue(), cacheObj, AuthCommon.TOKEN_CACHE_TIME);
//            //转换给当前请求使用
//            requestUserInfo = JSON.parseObject(JSON.toJSONString(cacheObj), RequestUserInfo.class);
//        }
//        chain.doFilter(servletRequest, servletResponse);
//    }
//
//    @Override
//    public void destroy() {
//
//    }
//
//
//    @Override
//    public int getOrder() {
//        return 0;
//    }
//
//
//    private boolean isAuthPath(String path) {
//        for (String s : AuthCommon.AUTH_PATH) {
//            if (path.startsWith(s)) {
//                return true;
//            }
//        }
//        return false;
//    }
//
//    @SuppressWarnings("all")
//    private void writeError(IErrorCode errorCode, HttpServletResponse response) throws IOException {
//        response.setStatus(errorCode.getCode());
//        response.setContentType("text/html;charset=UTF-8");
//        response.getWriter().write(JSON.toJSONString(CommonResult.failed(ResultCode.UNAUTHORIZED)));
//    }
//}
